﻿//==============================================================================
// File: ActionRegistryHelper.cs
// Created: 2010-04-30
// Author: Piotr Włodek
//==============================================================================
// This file is a part of MAMMOTH project.
// Copyright (C) 2010 AGH University of Science and Technology, Krakow.
// https://caribou.iisg.agh.edu.pl/trac/mammoth
//
// Mammoth is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// Mammoth is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with Mammoth. If not, see http://www.gnu.org/licenses/.
//==============================================================================

using System.Windows;
using System.Windows.Controls;
using WpfRcp.Core.Common;
using Microsoft.Practices.ServiceLocation;

namespace WpfRcp.Core.Services.Commands
{
    public static class ActionRegistryHelper
    {
        public static string GetContextMenu(ContextMenu obj)
        {
            return (string)obj.GetValue(ContextMenuProperty);
        }

        public static void SetContextMenu(ContextMenu obj, string value)
        {
            obj.SetValue(ContextMenuProperty, value);
        }

        public static readonly DependencyProperty ContextMenuProperty =
            DependencyProperty.RegisterAttached("ContextMenu", typeof(string),
                typeof(ActionRegistryHelper), new UIPropertyMetadata(null, OnContextMenuChanged));

        private static void OnContextMenuChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
        {
            if (args.OldValue != null)
            {
                var contextMenu = (ContextMenu) d;
                contextMenu.Loaded -= OnContextMenuLoaded;
            }

            if (args.NewValue != null)
            {
                var contextMenu = (ContextMenu) d;
                contextMenu.Loaded += OnContextMenuLoaded;
            }
        }

        private static void OnContextMenuLoaded(object sender, RoutedEventArgs e)
        {
            var contextMenu = (ContextMenu) sender;
            var name = GetContextMenu(contextMenu);
            var providerName = GetProviderName(contextMenu);
            var factoryName = GetFactoryName(contextMenu);

            var contextMenuItemProvider = string.IsNullOrEmpty(providerName)
                                              ? ServiceLocator.Current.GetInstance<IContextMenuItemProvider>()
                                              : ServiceLocator.Current.GetInstance<IContextMenuItemProvider>(providerName);

            contextMenu.ItemsSource = contextMenuItemProvider.GetVisualItems(name, factoryName);
        }

        #region FactoryName Attached Property

        public static string GetFactoryName(DependencyObject obj)
        {
            return (string)obj.GetValue(FactoryNameProperty);
        }

        public static void SetFactoryName(DependencyObject obj, string value)
        {
            obj.SetValue(FactoryNameProperty, value);
        }

        public static readonly DependencyProperty FactoryNameProperty =
            DependencyProperty.RegisterAttached("FactoryName", typeof(string),
                                                typeof(ActionRegistryHelper), new UIPropertyMetadata(null));

        #endregion

        #region ProviderName Attached Property

        public static string GetProviderName(DependencyObject obj)
        {
            return (string)obj.GetValue(ProviderNameProperty);
        }

        public static void SetProviderName(DependencyObject obj, string value)
        {
            obj.SetValue(ProviderNameProperty, value);
        }

        public static readonly DependencyProperty ProviderNameProperty =
            DependencyProperty.RegisterAttached("ProviderName", typeof(string),
                                                typeof(ActionRegistryHelper), new UIPropertyMetadata(null));

        #endregion
    }
}